/*
  Mex num
  题目描述
    现给定一个 a 数组，长度为 n {a1，a2，... an}。
    Mex(a) 为 a 数组当中最小的数字。
    给定一个整数 m，代表我们最多的操作次数。
      每次操作：可以选择一个位置的数值 +1。
    问操作之后 Mex(a)最大是多少？
  输入格式
    第一行两个整数 n, m，分别代表数组长度和最多的操作次数。
    第二行 n 个整数 ai。​
    其中, n <= 1e5, m <= 1e12, 0 <= ai <= 1e9
  输出格式
    一个整数，代表操作之后 Mex(a) 最大是多少？
  输入数据 1
    4 10
    1 2 3 4
  输出数据 1
    5
  输入数据 2
    1 1000000000000
    1000000000
  输出数据 2
    1001000000000
*/

#include <bits/stdc++.h>

using namespace std;

/*
  思路:
    通常采用二分答案算法的话, 需要首先明确 2 个核心问题:
      1) 答案的取值范围(区间)，即确定区间的最大值和最小值
      2) 判断某个答案是否满足题意(条件)的判定方法
    解答本题时，先明确出这 2 个问题:
      1）答案的取值范围(区间)
          区间的最小值: 数组中的最小值;
          区间的最大值: 数组中的最大值 + m 次操作加的数值;
      2) 判断某个答案是否满足题意的判定方法:
          遍历数组中的每个数 a[i]，如果 a[i] 小于 x，则累计统计 x 和 a[i] 之间的差值(x - a[i])，结果放到变量 sum 中；
          如果完成对数组 a 的遍历后，sum 小于等于 x，则该答案满足题目要求；
          否则，则该答案不满题目要求!
*/

long long n, m;
long long a[100010] = {};  // a[i] 表示发起数组中第 i 个数的值 (其中 i > 0)
long long s = 1e18, e = 0; // s(start) 表示二分答案算法实现中进行二分查找时的开始边界(左边界)
                           // e(end)   表示二分答案算法实现中进行二分查找时的结束边界(右边界)

// 该函数用来判断输入 x(表示答案，即经过 m 次操作后，数组 a 中的最小值) 是否满足条件(题目要求)
bool check(long long x) {
    long long sum = 0;  // 如果 a[i] 小于 x，则累计统计 x 和 a[i] 之间的差值(x - a[i])，结果放到变量 sum 中

    // 如果完成对数组 a 的遍历后，sum 小于等于 x，则该答案满足题目要求；
    // 否则，则该答案不满题目要求!
    for (int i = 1; i <= n; i++) {
        if (x > a[i]) {
            sum += x - a[i];
        }
    }

    return sum <= m;
}

int main() {
    cin >> n;
    cin >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        if (e < a[i]) {
            e = a[i];
        }
        if (s > a[i]) {
            s = a[i];   // 答案的取值范围区间的最小值: 数组中的最小值
        }
    }
    e = e + m;  // 答案的取值范围区间的最大值: 数组中的最大值 + m 次操作加的数值

    /*
      用二分查找法，在答案的区间范围内，查找满足题目要求的最小值
      注意:
        特别技巧: 我们在编码时，要保证区间的最大值 e 一定大于等于 区间的最小值 s
                 这样就可以保证一定会进行一次循环处理!
    */
    long long num = 0;
    while (s <= e)  {
        long long mid = (s + e) / 2;
        if (check(mid)) {
            num = mid;
            s = mid + 1;  // 由于需要答案尽可能地大，所以我们进一步从 mid 的右半区间进行查找
        } else {
            e = mid - 1;  // mid 不满足题目要求，从 mid 的左半区间进行查找
        }
    }
    cout << num;

    return 0;
}